package com.credithc.quartz.cluster;

import java.lang.reflect.Method;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
/** 
 * <br>类 名: DefaultReflectQuartzJobBean
 * <br>描 述: 执行目标对象的目标函数
 * <br>作 者: zhaoc
 * <br>创 建： 2015年7月23日
 * <br>版 本：
 * 
 * <br>历 史: (版本) 作者 时间 注释 
 */
public class DefaultReflectQuartzJobBean extends QuartzJobBean {
	
	private ApplicationContext context;
	
	/**目标对象*/
	private String targetObject;
	
	/**目标函数*/
	private String targetMethod = "execute";
	/**
	 * 通用写法
	 * 通过spring上下文 反射出目标对象 调用 目标函数,支持无参数自定义任务或spring上下文参数的任务
	 */
	@Override
	protected void executeInternal(JobExecutionContext jobContext)
			throws JobExecutionException {
		Method m = null;
		Object otargetObject = this.context.getBean(targetObject);
			try {
				m = otargetObject.getClass().getMethod(targetMethod, new Class[] {});
				m.invoke(otargetObject, new Object[] {}); /* 无参数方法调用 */
			} catch (NoSuchMethodException e) {
				try {
					m = otargetObject.getClass().getMethod(targetMethod, new Class[] {ApplicationContext.class});
					m.invoke(otargetObject, new Object[] {this.context}); /* 提供 spring context 的调用 */
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
	}

	/**
	 * 目标 对象注入
	 */
	public void setTargetObject(String targetObject) {
		this.targetObject = targetObject;
	}
	/**
	 * 目标方法注入
	 */
	public void setTargetMethod(String targetMethod) {
		this.targetMethod = targetMethod;
	}
	/**
	 * 
	 * 此处使用默认的 spring 上下文 已经被 添加到 scheduler 并且 key值 为 applicationContext
	 * @param applicationContext
	 */
	public void setApplicationContext(ApplicationContext applicationContext) {
		this.context = applicationContext;
	}

}
